package cn.fhkj.util;

import lombok.extern.slf4j.Slf4j;

import javax.mail.Address;
import javax.mail.Message;
import javax.mail.Session;
import javax.mail.Transport;
import javax.mail.internet.InternetAddress;
import javax.mail.internet.MimeMessage;
import java.io.UnsupportedEncodingException;
import java.util.Date;
import java.util.Properties;

/**
 * 邮件发送工具类
 */
@Slf4j
public class SendMailUtil {
    /**
     * 邮件发送的方法
     * 
     * @param to 收件人
     * @param subject 主题
     * @param content 内容
     * @param smtp 协议
     * @param host 发送服务器
     *  发件人邮箱的 SMTP 服务器地址, 必须准确, 不同邮件服务器地址不同, 一般(只是一般, 绝非绝对)格式为: smtp.xxx.com
     *  网易163邮箱的 SMTP 服务器地址为: smtp.163.com
     * @param sendName 邮件发送人邮箱
     * @param sendPort 邮件发送人端口  QQ邮箱的SMTP(SLL)端口为465或587, 其他邮箱自行去查看)
     * @param userName 邮件发送人名  登录邮箱的用户名（不带@163.com，登录邮箱的邮箱账号，不是邮箱地址）
     * @param userPwd 邮件发送人密码 登录邮箱的密码
     * @param nick 自定义发件人昵称
     * 
     * @return 成功或失败
     */
    public static boolean send(String to, String subject, String content, String smtp, String host,
            String sendName, String sendPort, String userName, String userPwd , String nick) {

        // 第一步：创建一封邮件:用于连接邮件服务器的参数配置（发送邮件时才需要用到）
        Properties props = new Properties();
        // 指定邮件的传输协议，smtp(Simple Mail Transfer Protocol 简单的邮件传输协议)
        props.put("mail.transport.protocol", smtp);
        // 指定邮件发送服务器服务器 "smtp.qq.com"
        props.put("mail.host", host);
        // 指定邮件的发送人(您用来发送邮件的服务器，比如您的163\sina等邮箱)
        props.put("mail.from", sendName);
        if (true) {
           /* props.put("mail.smtp.starttls.enable", "true");
            props.put("mail.smtp.socketFactory.fallback", "false");
            props.put("mail.smtp.socketFactory.port", sendPort);*/
            
            // PS: 某些邮箱服务器要求 SMTP 连接需要使用 SSL 安全认证 (为了提高安全性, 邮箱支持SSL连接, 也可以自己开启),
            //     如果无法连接邮件服务器, 仔细查看控制台打印的 log, 如果有有类似 “连接失败, 要求 SSL 安全连接” 等错误,
            //     打开下面 /* ... */ 之间的注释代码, 开启 SSL 安全连接。
            /*
            // SMTP 服务器的端口 (非 SSL 连接的端口一般默认为 25, 可以不添加, 如果开启了 SSL 连接,
            //                  需要改为对应邮箱的 SMTP 服务器的端口, 具体可查看对应邮箱服务的帮助,
            //                  QQ邮箱的SMTP(SLL)端口为465或587, 其他邮箱自行去查看)

             */
            final String smtpPort = "465";
            props.setProperty("mail.smtp.port", smtpPort);
            props.setProperty("mail.smtp.socketFactory.class", "javax.net.ssl.SSLSocketFactory");
            props.setProperty("mail.smtp.socketFactory.fallback", "false");
            props.setProperty("mail.smtp.socketFactory.port", smtpPort);

        }
        
        //根据参数配置，创建会话对象（为了发送邮件准备的）
        Session session = Session.getDefaultInstance(props);

        // 开启调试模式
        session.setDebug(true);
        
        try {
            // 第二步：获取邮件发送对象
            Transport transport = session.getTransport();
            // 连接邮件服务器，链接您的163、sina邮箱，用户名（不带@163.com，登录邮箱的邮箱账号，不是邮箱地址）、密码
            transport.connect(userName, userPwd);
            Address toAddress = new InternetAddress(to);

            // 第三步：创建邮件消息体
            MimeMessage message = new MimeMessage(session);
            
            //设置自定义发件人昵称
            try {
                nick=javax.mail.internet.MimeUtility.encodeText(nick);
            } catch (UnsupportedEncodingException e) {
                e.printStackTrace();
            } 
            
            /* 设置发信人
             * 其中 InternetAddress 的三个参数分别为: 邮箱, 显示的昵称(只用于显示, 没有特别的要求), 昵称的字符集编码
             */
            message.setFrom(new InternetAddress(sendName, nick, "UTF-8"));
            
            // 邮件的主题
            message.setSubject(subject , "UTF-8");
            
            //收件人
            message.addRecipient(Message.RecipientType.TO, toAddress);
            
            // 邮件的正文内容
            message.setContent(content, "text/html;charset=utf-8");
            
            // 邮件发送时间
            message.setSentDate(new Date());

            // 第四步：发送邮件
            // 第一个参数：邮件的消息体
            // 第二个参数：邮件的接收人，多个接收人用逗号隔开（test1@163.com,test2@sina.com）
            transport.sendMessage(message, InternetAddress.parse(to));
            return true;
        } catch (Exception e) {
        	log.error("",e);
            e.printStackTrace();
        }
        return false;
    }

    public static void main(String[] args) {
        // 您要发送给谁，标题，内容
    	SendMailUtil.send("1093221911@qq.com", "邮件标题", "邮件正文内容", "smtp",
    			"smtp.pluslegal.cn", "legalplus@pluslegal.cn", "25","legalplus@pluslegal.cn", "Fahkj@#1234" , "法和科技");
    }
    
    /**
	 * sina.com:  
		POP3服务器地址:pop3.sina.com.cn（端口：110）  
		SMTP服务器地址:smtp.sina.com.cn（端口：25）   
		  
		sinaVIP：  
		POP3服务器:pop3.vip.sina.com （端口：110）  
		SMTP服务器:smtp.vip.sina.com （端口：25）  
		  
		sohu.com:  
		POP3服务器地址:pop3.sohu.com（端口：110）  
		SMTP服务器地址:smtp.sohu.com（端口：25）  
		  
		126邮箱：  
		POP3服务器地址:pop.126.com（端口：110）  
		SMTP服务器地址:smtp.126.com（端口：25）  
		  
		139邮箱：  
		POP3服务器地址：POP.139.com（端口：110）  
		SMTP服务器地址：SMTP.139.com(端口：25)  
		  
		163.com:  
		POP3服务器地址:pop.163.com（端口：110）  
		SMTP服务器地址:smtp.163.com（端口：25）  
		  
		QQ邮箱   
		POP3服务器地址：pop.qq.com（端口：110）  
		SMTP服务器地址：smtp.qq.com （端口：25）  
		  
		QQ企业邮箱  
		POP3服务器地址：pop.exmail.qq.com （SSL启用 端口：995）  
		SMTP服务器地址：smtp.exmail.qq.com（SSL启用 端口：587/465）  
		  
		yahoo.com:  
		POP3服务器地址:pop.mail.yahoo.com  
		SMTP服务器地址:smtp.mail.yahoo.com  
		  
		yahoo.com.cn:  
		POP3服务器地址:pop.mail.yahoo.com.cn（端口：995）  
		SMTP服务器地址:smtp.mail.yahoo.com.cn（端口：587  
		  
		HotMail  
		POP3服务器地址：pop3.live.com （端口：995）  
		SMTP服务器地址：smtp.live.com （端口：587）  
		  
		gmail(google.com)  
		POP3服务器地址:pop.gmail.com（SSL启用 端口：995）  
		SMTP服务器地址:smtp.gmail.com（SSL启用 端口：587）  
		  
		263.net:  
		POP3服务器地址:pop3.263.net（端口：110）  
		SMTP服务器地址:smtp.263.net（端口：25）  
		  
		263.net.cn:  
		POP3服务器地址:pop.263.net.cn（端口：110）  
		SMTP服务器地址:smtp.263.net.cn（端口：25）  
		  
		x263.net:  
		POP3服务器地址:pop.x263.net（端口：110）  
		SMTP服务器地址:smtp.x263.net（端口：25）  
		  
		21cn.com:  
		POP3服务器地址:pop.21cn.com（端口：110）  
		SMTP服务器地址:smtp.21cn.com（端口：25）  
		  
		Foxmail：  
		POP3服务器地址:POP.foxmail.com（端口：110）  
		SMTP服务器地址:SMTP.foxmail.com（端口：25）  
		  
		china.com:  
		POP3服务器地址:pop.china.com（端口：110）  
		SMTP服务器地址:smtp.china.com（端口：25）  
		  
		tom.com:  
		POP3服务器地址:pop.tom.com（端口：110）  
		SMTP服务器地址:smtp.tom.com（端口：25）  
		  
		etang.com:  
		POP3服务器地址:pop.etang.com  
		SMTP服务器地址:smtp.etang.com  
	 */
}